package org.jiuling.basics.validation;

import javax.annotation.processing.Generated;
import java.lang.annotation.*;

/**
 * 注解校验
 * @author 紫灵
 * @date 2023年02月15日 22时36分49秒
 */
public class AnnotationVerify {

    /** 私有构造方法，禁止创建对象 */
    private AnnotationVerify() {}

    /**
     * 是否为元注解
     * @param annotation 注解
     * @return 是否为元注解
     */
    public static boolean isMetaAnnotation(Annotation annotation){
        return annotation.annotationType() == Deprecated.class ||
                annotation.annotationType() == SuppressWarnings.class ||
                annotation.annotationType() == Override.class ||
                annotation.annotationType() == Generated.class ||
                annotation.annotationType() == Target.class ||
                annotation.annotationType() == Retention.class ||
                annotation.annotationType() == Documented.class ||
                annotation.annotationType() == Inherited.class;
    }

    /**
     * 判断是否具有指定注解
     * @param annotations 注解数组
     * @param annotationClass 指定注解类
     * @param ergodic 是否进行迭代
     * @return 是否包含指定注解
     */
    public static boolean includeAnnotation(Annotation[] annotations,Class<?> annotationClass,boolean ergodic){
        if(ArrayVerify.isEmpty(annotations)){
            return false;
        }
        // 便利注解
        for (Annotation annotation : annotations) {
            // 判断直接是否为指定注解
            if(annotation.annotationType().equals(annotationClass)){
                return true;
                // 进行迭代
            }else if(ergodic){
                // 判断子注解中是否存在指定注解
                if(BooleanVerify.isTrue(includeAnnotation(annotation.annotationType().getAnnotations(), annotationClass, ergodic))){
                   return  true;
                }
            }
        }
        return false;
    }
}
